package com.itdct.onflow.core.util

import com.itdct.onflow.core.extend.logWarn
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream

/**
 * @author Zhouwx
 * @date 2025/10/9 10:15:58
 * @version 1.0
 * @description
 */
object ZipUtil {
    /**
     * 将多个File对象打包到指定ZIP文件（核心方法）
     *
     * @param sourceFiles 需要打包的源文件列表
     * @param zipFilePath 目标ZIP文件的完整路径
     * @return 成功生成的ZIP文件对象
     */
    fun packToZip(sourceFiles: List<File>, zipFilePath: String): File {
        val zipFile = File(zipFilePath)
        // 确保目标目录存在
        zipFile.parentFile?.mkdirs()

        FileOutputStream(zipFile).use { fos ->
            ZipOutputStream(fos).use { zos ->
                for (sourceFile in sourceFiles) {
                    if (sourceFile.exists()) {
                        // 使用文件名作为ZIP条目名，避免包含完整路径
                        val entryName = sourceFile.name
                        addFileToZip(zos, sourceFile, entryName)
                    } else {
                        logWarn("警告: 文件 ${sourceFile.name} 不存在，已跳过。")
                    }
                }
                zos.finish()
            }
        }
        return zipFile
    }

    /**
     * 将一个文件添加到ZIP输出流中
     *
     * @param zos ZipOutputStream对象
     * @param fileToAdd 要添加的文件
     * @param entryName 文件在ZIP包中的名称（可包含相对路径）
     */
    private fun addFileToZip(zos: ZipOutputStream, fileToAdd: File, entryName: String) {
        val zipEntry = ZipEntry(entryName)
        zos.putNextEntry(zipEntry)

        FileInputStream(fileToAdd).use { fis ->
            fis.copyTo(zos)
        }
        zos.closeEntry()
    }
}